package com.carrental.finance.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.carrental.finance.dto.RefundDTO;
import com.carrental.finance.entity.Refund;
import com.carrental.finance.vo.RefundVO;

/**
 * 退款服务接口
 */
public interface RefundService extends IService<Refund> {

    /**
     * 创建退款记录
     *
     * @param refundDTO 退款DTO
     * @return 退款ID
     */
    Long createRefund(RefundDTO refundDTO);

    /**
     * 根据ID获取退款详情
     *
     * @param id 退款ID
     * @return 退款VO
     */
    RefundVO getRefundById(Long id);

    /**
     * 根据退款单号获取退款详情
     *
     * @param refundNo 退款单号
     * @return 退款VO
     */
    RefundVO getRefundByRefundNo(String refundNo);

    /**
     * 根据支付ID获取退款详情
     *
     * @param paymentId 支付ID
     * @return 退款VO
     */
    RefundVO getRefundByPaymentId(Long paymentId);

    /**
     * 根据订单ID分页查询退款记录
     *
     * @param orderId 订单ID
     * @param page    分页参数
     * @return 退款VO分页
     */
    Page<RefundVO> pageOrderRefunds(Long orderId, Page<Refund> page);

    /**
     * 根据用户ID分页查询退款记录
     *
     * @param userId 用户ID
     * @param page   分页参数
     * @return 退款VO分页
     */
    Page<RefundVO> pageUserRefunds(Long userId, Page<Refund> page);

    /**
     * 分页查询退款记录
     *
     * @param page       分页参数
     * @param refundNo   退款单号
     * @param paymentNo  支付单号
     * @param orderNo    订单号
     * @param userId     用户ID
     * @param refundType 退款类型
     * @param status     退款状态
     * @param startTime  开始时间
     * @param endTime    结束时间
     * @return 退款VO分页
     */
    Page<RefundVO> pageRefunds(Page<Refund> page, String refundNo, String paymentNo, String orderNo, Long userId, Integer refundType, Integer status, String startTime, String endTime);

    /**
     * 处理退款回调
     *
     * @param refundNo      退款单号
     * @param transactionId 交易流水号
     * @param status        退款状态
     * @return 是否成功
     */
    boolean handleRefundCallback(String refundNo, String transactionId, Integer status);

    /**
     * 取消退款
     *
     * @param id 退款ID
     * @return 是否成功
     */
    boolean cancelRefund(Long id);
} 